Skip to main content

发布订阅模式与观察者模式区别?

发布订阅模式

  • 订阅者把自己想订阅的事件注册调度中心
  • 发布者发布该事件调度中心,也就是该事件触发
  • 由调度中心统一调度订阅者注册到调度中心的处理代码

观察者模式

  • 观察者直接订阅主题
  • 而当主题被激活的时候
  • 会触发观察者里的事件

两者区别

  • 观察者模式里只有两个角色:观察者和被观察者。
  • 发布订阅模式里有三种角色:发布者、订阅者、调度器(第三者)。
  • 在观察者模式中,观察者是知道 Subject 的,Subject 一直保持对观察者进行记录。
  • 在发布订阅模式中,发布者和订阅者不知道对方的存在。它们只有通过消息代理进行通信。
  • 在发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。
  • 观察者模式主要以同步方式实现,即当某些事件发生时,Subject 调用其所有观察者的适当方法。
  • 发布者/订阅者在大多情况下是异步方式(使用消息队列)

综上:观察者模式和发布订阅模式本质上都有发布订阅的思想,但是又有一定的区别,所以我们不能将二者完全等同起来。

应用场景

  • 观察者模式在很多场景中都在使用,除了原生 DOM 上监听事件外,还有最常用的是 Vue 组件中父子之间的通信。

  • 订阅发布模式应用场景是在跨多层组件通信时,如果利用父子组件通信一层层订阅发布,可维护性和灵活性很差,一旦中间某个环节出问题,整个传播链路就会瘫痪。这时采用独立出来的 EventBus 解决这类问题,只要能访问到 EventBus 对象,便可通过该对象订阅和发布事件。